import lombok.SneakyThrows;
import org.apache.camel.ProducerTemplate;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.impl.DefaultCamelContext;
import org.apache.camel.model.ModelCamelContext;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;

import static org.eclipse.paho.client.mqttv3.MqttConnectOptions.MQTT_VERSION_3_1_1;

/**
 * @author v_zhangshun01
 */
public class App {


    private static final String BROKER_URL = "tcp://127.0.0.1:1883";

    private static final String USERNAME = "admin";

    private static final String PASSWORD = "public";

    private static final String CLIENT = "f1f23d";

    private static final Integer MQTT_VERSION = MQTT_VERSION_3_1_1;


    @SneakyThrows
    public static void main(String[] args) {


        // 这是camel上下文对象，整个路由的驱动全靠它了。
        ModelCamelContext camelContext = new DefaultCamelContext();

        // 启动route
        camelContext.start();

        // 将我们编排的一个完整消息路由过程，加入到上下文中
        camelContext.addRoutes(new RouteBuilder() {

            @Override
            public void configure() {

                from("direct:start")
                        .to(String.format("paho:t01" +
//                                服务端地址
                                "?brokerUrl=%s" +
//                                用户名
                                "&userName=%s" +
//                                密码
                                "&password=%s" +
//                                客户端 id，必须唯一
                                "&clientId=%s" +
//                                是否留存
                                "&retained=false" +
//                                mqtt 的版本
                                "&mqttVersion=%d" +
//                                服务质量
                                "&qos=0", BROKER_URL, USERNAME, PASSWORD, CLIENT, MQTT_VERSION));
            }

        });

        final ProducerTemplate producerTemplate = camelContext.createProducerTemplate();


        for (int i = 0; i < 100; i++) {
            producerTemplate.sendBody("direct:start", "hello" + i);
        }



        /*
         * ==========================
         * 为什么我们先启动一个Camel服务
         * 再使用addRoutes添加编排好的路由呢？
         * 这是为了告诉各位读者，Apache Camel支持动态加载/卸载编排的路由
         * 这很重要，因为后续设计的Broker需要依赖这种能力
         * ==========================
         * */
        // 通用没有具体业务意义的代码，只是为了保证主线程不退出
        synchronized (App.class) {
            App.class.wait();
        }
    }

}
